﻿/*  
  Autor:          
  Fecha:            
  ----------------------------------Historial----------------------------------
  Autor                    			Fecha                      			Descripcion

*/
using System;
using System.Collections.Generic;
using System.Data;
using System.Globalization;
using System.Reflection;
using Microsoft.Reporting.WebForms;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Microsoft.Practices.ServiceLocation;
using Utpl.Syllabus.Framework;
using Utpl.Syllabus.Framework.Core;
using Utpl.Syllabus.Framework.Reports;
using Utpl.Syllabus.Framework.Web.UI;
using Utpl.Syllabus.Infrastructure.Logging;
using Utpl.Syllabus.Nucleo.BL;
using Utpl.Syllabus.Reconocimiento.BL;
using Utpl.Syllabus.Reconocimiento.Web;

namespace Utpl.Syllabus.Reconocimiento.Web
{

    [NotAuthorize]
    public partial class pgReporteReconocimiento : SyPage
    {
        public SessionReportesClass parametrosReporte;

        /// <summary>
        /// Variable paraa realizar Log
        /// </summary>
        private static readonly ILogger log = ServiceLocator.Current.GetInstance<ILoggerFactory>().Create(typeof(pgReporteReconocimiento));


        private SessionReportesClass sessionParm
        {
            get
            {
                return (SessionReportesClass)HttpContext.Current.Session["pgReporteReconocimiento.aspx" + "sessionParm"];

            }
            set
            {
                HttpContext.Current.Session["pgReporteReconocimiento.aspx" + "sessionParm"] = value;
            }

        }
        DataSet ToDataSet<T>(IList<T> list,string nameDataSet,string nameTable)
        {
            Type elementType = typeof(T);
            DataSet ds = new DataSet(nameDataSet);
            DataTable t = new DataTable(nameTable);
            ds.Tables.Add(t);

            //add a column to table for each public property on T
            foreach (var propInfo in elementType.GetProperties())
            {
                t.Columns.Add(propInfo.Name, propInfo.PropertyType);
            }

            //go through each property on T and add each value to the table
            foreach (T item in list)
            {
                DataRow row = t.NewRow();
                foreach (var propInfo in elementType.GetProperties())
                {
                    row[propInfo.Name] = propInfo.GetValue(item, null);
                }
            }

            return ds;
        }
        protected void Page_Load(object sender, EventArgs e)
        {
            try
            {
                if (!IsPostBack)
                {
                    int id ;

                    int.TryParse(Session["IdReconocimientoEstudio"].ToString(), out id);

                    var criteria = ReconocimientoEstudioCriteria.New();
                    criteria.NumeroProceso = id;
                    ReconocimientoEstudioList recEstudioList = ReconocimientoEstudioList.Get(criteria);
                    //
                    if(recEstudioList.Count()!=0){
                        //Id del Usuario que se Logea en el Sistema
                        var app = ServiceLocator.Current.GetInstance<ISyllabusApplication>();
                        ReconocimientoEstudioInfo dataRecEstudio = recEstudioList.First();
                        var tableEncabezado = CreateDataTable(new string[]
                                            {
                                                "nombre","cedula","numrep","carrera","modalidad","fecha","login"
                                            });

                        DataRow row = tableEncabezado.NewRow();
                        row["nombre"] = getFormatString(dataRecEstudio.NombreSolicitante); 
                        row["cedula"] = getFormatString(dataRecEstudio.IdentificacionSolicitante);
                        row["numrep"]    = dataRecEstudio.NumeroProceso;
                        row["carrera"] = getFormatString(dataRecEstudio.NombreVariacion);
                        row["modalidad"] =string.Format("Una vez revisados los contenidos de los componentes educativos presentados por el estudiante y realizado el estudio de <b>HOMOLOGACIÓN</b>, en la titulación de <b>{0}</b>, en la modalidad de estudios <b>{1}</b> me permito informar a usted los resultados de dicho estudio.", dataRecEstudio.NombreVariacion, dataRecEstudio.Modalidad);
                        row["fecha"]     =string.Format("Loja,{0}", getFecha());
                        row["login"] = getFormatString(app.GetCurrentUser().Nombre);
                      
                        tableEncabezado.Rows.Add(row);

               
                        //
                        var tableDetalle = CreateDataTable(new string[]
                                            {
                                                "no", "componentereconocido", "codigo", "grupo", "creditos", "nota", "estado",
                                                "componentespresentad"
                                            });
                        int numrow = 1;
                        foreach (var item in dataRecEstudio.ComponentesReconocidos)
                        {

                            row = tableDetalle.NewRow();
                            row["no"] = numrow;
                            row["componentereconocido"] = getFormatString(item.NombreComponente);
                            row["codigo"] = getFormatString(item.CodigoComponente);
                            row["grupo"] = getFormatString(item.GrupoCredito);
                            row["creditos"] = item.Creditos;
                            row["nota"] = item.Nota;
                            row["estado"] = getFormatString(item.Estado);
                            row["componentespresentad"] = getFormatString(item.ComponentesPresentados);
                            numrow += 1;
                            tableDetalle.Rows.Add(row);

                        }

                        //
                        var tablePie = CreateDataTable(new string[]
                                            {
                                                "nombre","num"
                                            });
                        //if (dataRecEstudio.UsuarioFinalizaId!=0)
                        //{
                            List<string> usuariosList = new List<string>();
                           
                            usuariosList.Add(dataRecEstudio.UsuarioCrea);
                            if ( dataRecEstudio.UsuarioActualizaId != dataRecEstudio.UsuarioCreaId)
                                usuariosList.Add(dataRecEstudio.UsuarioActualiza);
                            if ( dataRecEstudio.UsuarioActualizaId != dataRecEstudio.UsuarioFinalizaId && dataRecEstudio.UsuarioFinalizaId != dataRecEstudio.UsuarioCreaId)
                            usuariosList.Add(dataRecEstudio.UsuarioFinaliza);
                            numrow = 1;
                            foreach (string nameUser in usuariosList)
                            {
                                if (!String.IsNullOrEmpty(nameUser))
                                {
                                    row = tablePie.NewRow();
                                    row["nombre"] = getFormatString(nameUser);
                                    row["num"] = numrow;
                                    numrow += 1;
                                    tablePie.Rows.Add(row);
                                }
                               
                            }
                        //}
                        //
                        ReportViewer1.LocalReport.DataSources.Clear();
                        ReportDataSource rds1 = new ReportDataSource();
                        rds1.Name = "DataSet1";
                        rds1.Value = tableEncabezado;
                        ReportViewer1.LocalReport.DataSources.Add(rds1);
                        ReportDataSource rds2 = new ReportDataSource();
                        rds2.Name = "DataSet2";
                        rds2.Value = tableDetalle;
                        ReportViewer1.LocalReport.DataSources.Add(rds2);
                        ReportDataSource rds3 = new ReportDataSource();
                        rds3.Name = "DataSet3";
                        rds3.Value = tablePie;
                        ReportViewer1.LocalReport.DataSources.Add(rds3);
                    }
                   
                   
                    
                    
                    //ReportViewer1.LocalReport.ReportPath = "ReporteReconocimiento.rdlc";
                    ReportViewer1.LocalReport.ReportPath = "Reportes/rdlc.rdlc";
                    //ReportViewer1.LocalReport.ReportPath = "Reportes/ReporteReconocimiento.rdlc";

                    //Se Obtiene una lista de todos los formatos que se pueden Exportar en Report Service (PDF, WORD, EXCEL, XML...)
                    //y se la recorre 
                    foreach (RenderingExtension elemento in ReportViewer1.LocalReport.ListRenderingExtensions())
                    {
                        //COndicion  para entrar a poner en falso la exportación a Todos los formatos Ecepto a PDF
                        if (elemento.Name != "EXCEL" && elemento.Name != "PDF")
                        {
                            //traemos la información del campo con sus respectivos flags
                            FieldInfo infCampo = elemento.GetType().GetField("m_isVisible", BindingFlags.Instance | BindingFlags.NonPublic);
                            //colocamos el valor de false a la extension
                            if (infCampo != null)
                                infCampo.SetValue(elemento, false);

                        }

                        // Permite Cambiar el Nombre EXCEL a un Personalizado en este caso "Exportar a EXCEL"
                        if (elemento.Name == "EXCEL")
                        {
                            FieldInfo info = elemento.GetType().GetField("m_localizedName", BindingFlags.Instance | BindingFlags.NonPublic);
                            if (info != null)
                                info.SetValue(elemento, "Exportar a Excel");
                        }
                        // Permite Cambiar el Nombre PDF a un Personalizado en este caso "Exportar a PDF"
                        if (elemento.Name == "PDF")
                        {
                            FieldInfo info = elemento.GetType().GetField("m_localizedName", BindingFlags.Instance | BindingFlags.NonPublic);
                            if (info != null)
                                info.SetValue(elemento, "Exportar a Pdf");

                        }
                    }
                    ReportViewer1.ShowPrintButton = true;
                    ReportViewer1.ShowToolBar = true;
                    ReportViewer1.ShowCredentialPrompts = false;
                    ReportViewer1.LocalReport.Refresh();
                   
             
                }
            }
            catch (Exception ex)
            {
                //Control de manejo de Excepciones
                ManejadorExcepcionesHelper.CatchExceptionLoad(ex, this.ManejadorExcepciones, this.ManejadorMensajes);
            }
        }

        private static DataTable CreateDataTable(string[] namesColumns )
        {
            DataSet ds = new DataSet();
            DataTable t = new DataTable();
            ds.Tables.Add(t);
            foreach (var propInfo in namesColumns)
            {
                t.Columns.Add(propInfo);
            }
            return t;
        }
        private string getFormatString(string dato)
        {
           string val = (!String.IsNullOrEmpty(dato)) ? CultureInfo.InvariantCulture.TextInfo.ToTitleCase(dato.ToLower()) : "";
           return val;
        }
        private string getFecha()
        {
            DateTime fecha = DateTime.Today;
            DateTimeFormatInfo dfFormatinfo = new CultureInfo("es-ES", false).DateTimeFormat;
           
            return string.Format("{0} de {1} {2}", fecha.Day, dfFormatinfo.GetMonthName(fecha.Month), fecha.Year);
        }
        public ReportParameter[] ConversionParametros()
        {
            try
            {
                ReportParameter[] reportParameters = new ReportParameter[] { };
                var indice = 0;
                string strParametrosvalor = string.Empty;
                var parms =
                    (Dictionary<string, string>)
                    parametrosReporte.getSession(SessionReportesClass.NombreVariable.parametrosReporte);

                if (parms != null && parms.Count > 0)
                {
                    reportParameters = new ReportParameter[parms.Count];
                    foreach (var parm in parms)
                    {
                        reportParameters[indice] = new ReportParameter(parm.Key, parm.Value);
                        strParametrosvalor += parm.Key + ": " + parm.Value + " ; ";
                        indice++;
                    }
                }
                log.Info("Se envía a Reporte: " + parametrosReporte.GetNombreReporteNombre + ", PARAMS: " + strParametrosvalor);
                return reportParameters;

            }
            catch (Exception)
            {
                return null;
            }
        }
    }
}